package org.groupg.practice.guiPractice.swing;

import javax.swing.*;
import java.awt.*;

// 定义一个继承自JFrame的GanttChartWithGridLayout类
public class GanttChartWithGridLayout extends JFrame {
    private static final int TIME_UNITS = 10; // 定义时间单位总数
    private static final int ROW_HEIGHT = 50; // 定义每行的高度

    // 构造函数
    public GanttChartWithGridLayout() {
        setTitle("使用网格布局的甘特图"); // 设置窗口标题
        setSize(800, 600); // 设置窗口大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗口关闭操作

        JPanel mainPanel = new JPanel(new GridLayout(4, TIME_UNITS)); // 创建一个4行TIME_UNITS列的网格布局面板
        mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // 设置面板边框

        // 添加时间标签
        for (int i = 0; i < TIME_UNITS; i++) {
            JLabel timeLabel = new JLabel(String.valueOf(i + 1)); // 创建时间标签
            timeLabel.setHorizontalAlignment(JLabel.CENTER); // 设置标签水平居中
            mainPanel.add(timeLabel); // 将标签添加到面板中
        }

        // 定义任务数组
        Task[] tasks = {
                new Task("任务1", 1, 5),
                new Task("任务2", 3, 8),
                new Task("任务3", 6, 10),
                new Task("任务4", 2, 4)
        };

        // 遍历任务数组，为每个任务创建面板，并添加到主面板中
        for (Task task : tasks) {
            JPanel taskPanel = new JPanel(); // 创建任务面板
            taskPanel.setLayout(new BorderLayout()); // 设置任务面板布局为边框布局
            JLabel taskLabel = new JLabel(task.name); // 创建任务名称标签
            taskPanel.add(taskLabel, BorderLayout.WEST); // 将任务名称标签添加到任务面板的西部

            JPanel taskBar = new JPanel(); // 创建任务条面板
            taskBar.setBackground(Color.BLUE); // 设置任务条背景色为蓝色
            // 根据任务的开始和结束时间计算任务条的宽度，并设置任务条面板的首选大小
            taskBar.setPreferredSize(new Dimension((task.end - task.start) * (getWidth() - 20) / TIME_UNITS, ROW_HEIGHT - 10));
            taskPanel.add(taskBar, BorderLayout.CENTER); // 将任务条面板添加到任务面板的中心

            // 在任务开始之前，添加空面板到主面板中
            for (int i = 0; i < task.start - 1; i++) {
                mainPanel.add(new JPanel());
            }

            mainPanel.add(taskPanel); // 将任务面板添加到主面板中

            // 在任务结束之后，添加空面板到主面板中
            for (int i = task.end; i <= TIME_UNITS; i++) {
                mainPanel.add(new JPanel());
            }
        }

        add(mainPanel); // 将主面板添加到窗口中
    }

    // 主函数
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> { // 使用SwingUtilities的invokeLater方法确保UI操作在事件调度线程中执行
            GanttChartWithGridLayout ganttChart = new GanttChartWithGridLayout(); // 创建GanttChartWithGridLayout对象
            ganttChart.setVisible(true); // 设置窗口可见
        });
    }

    // 定义一个内部类Task，表示一个任务
    private static class Task {
        String name; // 任务名称
        int start; // 任务开始时间
        int end; // 任务结束时间

        // 构造函数
        Task(String name, int start, int end) {
            this.name = name;
            this.start = start;
            this.end = end;
        }
    }
}